مترجم : حبیب الله علیخانی
منبع:راسخون



 

واسط های گرافیکی در جاوا :

دراین بخش به برنامه نویسی جاوا که از GUI (graphical user interface) یا واسط گرافیکی کاربر استفاده می کند می پردازیم. به خصوص شما یاد می گیرید که چگونه برنامه ای بنویسید که پنجره ای را در صفحه قرار دهید. در آینده در بخش های دیگر نشان می دهیم که چگونه عناصر رابط مانند منو ها (menu) و دکمه ها (button) را در application یا برنامه کاربردی خودمان قرار دهیم و همچنین چگونه event ها یا رویداد ها مانند فشردن صفحه کلید یا کلیک کردن موس را پردازش کنیم.
اگر شما قصد دارید ازjava برای یرنامه نویسی سرور (server-side) استفاده کنید، این بخش را کنار بگذارید.
واسط گرافیکی کاربر یا GUI (Graphical User Interface)
وقتی که java 1.0 ایجاد شد، شامل کتابخانه هایی از کلاسها، برای برنامه نویسی GUI ابتدایی بود که شرکت SUN آنرا AWT (Window Toolkit Abstract) نامیده بود. کتابخانه ابتدایی AWT به ساخت عناصر واسط کاربر(user interface elements) با محول کردن ساخته ها و رفتار هایش به ابزار (tool kit) GUI بومی روی هر platform مقصد(Windows, Solaris, Macintosh, و ...) اقدام کرد. از اینرو شرکت sun شعار " یک بار بنویس، هرجا اجرا کن" را تجاری کرد.
این رویکرد برای Application ساده خوب کار می کرد، اما طولی نکشید که معلوم شد که نوشتن یک کتابخانه ی گرافیکی قابل حمل(بسته به عناصر واسط کاربر) خیلی مشکل بود. عناصر واسط کاربر مانند منو ها(menu) ، اسکرول بار(scrollbar) و
Text field ها در platform های گوناگون تفاوت های ریزی می توانند داشته باشند. بنابراین با این روش پیشبینی و سازگاری کاربرها مشکل بود. علاوه براین بعضی از محیط های گرافیکی( مانند X11/Motif) به اندازه ی ویندوز یا مکینتاش مجموعه کامپوننت های(اجزای) واسط کاربرغنی ای نداشت. در نتیجه Application های GUI ساخته شده به وسیله ی AWT ساده، به خوبی Application های بومی ویندوز یا مکینتاش به نظر نمی رسید. کارکردی که کاربران این پلتفرم ها انتظار داشتند را نداشت. متاسفانه در پلتفرم های مختلف در کتابخانه واسط کاربر AWT باگ های زیادی وجود داشت.
توسعه دهندگان(برنامه نویسان) از اینکه باید اپلیکیشن های خود را روی هر پلتفرمی تست کنند، شکایت می کردند.این کار" یکبار بنویس، همه جا اجرا کن" نام گرفت.
درسال 1996 ، Netscape کتابخانه ی GUI ای ایجاد کرد که IFC (Internet Foundation Classes) نام گرفت که یک روش کاملا متفاوتی بود.عناصر واسط کاربر،مانند دکمه ها، منوها و ...در یک پنجره ی خالی رسم می شدند.
یک روش برای ساختن پنجره ها و رسم کردن در آن بود. بنابراین Netscape بدون اینکه برنامه روی چه پلتفرمی اجرا می شود رفتار کرد. شرکت Sun با Netscape برای کامل کردن این روش کار کرد. ویک کتابخانه ی واسط کاربر به نام Swing ایجاد کردند. Swing در java 1.1 هم در دسترس قرار گرفت و بخشی از کتابخانه ی استاندارد در Java SE 1.2 قرار گرفت.
اکنون Swing نام رسمی Toolkit (ابزار) GUI است.
در حقیقت در برنامه‌های کاربردی جاوا برای ایجاد یک واسط گرافیکی کاربر یا GUI از JFC استفاده می‌شود.JFC یک مجموعه از کتابخانه های طراحی شده برای کمک به برنامه نویسان جاوا جهت توسعه برنامه های کاربردی تجاری و با ابعاد گسترده می باشد. Swing بخشی از JFC است و JFC وسیع تر و به مراتب شامل swing است. بعلاوه کامپوننت swing همچنین، یک API قابل دسترسی ، API دو بعدی و API درگ دراپ(drag and drop)دارد
JFC از پنج بخش زیر تشکیل شده است:

1- Swing
2- AWT (Abstract Window Toolkit)
3- Accessibility API
4- Java 2D API
5- Enhanced Support for Drag and Drop capabilities

هر یک از این پنج بخش شامل مجموعه ای از کلاس ها جهت طراحی GUI می باشد. مثلا برای کنترل و مدیریت رویدادهای (Event ) ماوس یا صفحه کلید در واسط های کاربر، از AWT یا Swing می توان استفاده نمود و یا برای شماتیک کردن برنامه مانند پیاده سازی نمودارها، گراف ها، تصاویر و بطور کلی گرافیک دو بعدی از Java 2D می توان کمک گرفت.
در بین این مجموعه ابزارها، دو ابزار AWT و Swing برای ویژوالی کردن برنامه مورد استفاده قرار می گیرند. یعنی از هریک از دو مجموعه فوق می توان به منظور ویژوال سازی برنامه به طور مستقل از مجموعه دیگر استفاده نمود.
همانطور که می بینید swing، قسمتی از JFCمی باشد و بسته Swing شامل یک مجموعه از کامپوننت ها برای ایجاد GUI ها و اضافه کردن قابلیت محاوره ای به برنامه های کاربردی جاوا مورد استفاده قرار می گیرد. Swing‌شامل ابزارهای مفید و پرکاربردی مانند Table , List ,Tree Controls و بسیاری ابزارهای دیگر می باشد.
Swing کاملا جایگزین AWT نشده است. درحقیقت بر روی معماری AWT ساخته شده است. swing به شما کامپوننت های واسط کاربر بیشتری ارئه می کند. هنگامیکه شما برنامه ی Swing می نویسید، از اصول AWT استفاده می کنید به خصوص زمانیکه با event (رویداد) کار می می کنید. از این به بعد، وقتی که قصد داریم کلاسهای واسط کاربر را ایجاد کنیم می گوییم swing و زمانیکه قصد داریم از مکانیزم اساسی ایجاد پنجره استفاده کنیم (مانند کار کردن با event ها) می گوییم AWT .

برخی از ویژگیهای Swing

1- swing عناصر واسط کاربری غنی تر و مناسب تری دارد
2- نام کامپوننت های(اجزای) Swing با حرف J شروع می شوند. مانند: Jtabbed Pane , Jtable
3- کامپوننت های Swing دارای خاصیت Tooltipsمی باشند.
4- Swing قابل حمل تر از AWTمی باشد و به پلتفرم وابستگی کمتری دارد.
5- کامپوننت های Swing از قابلیت Undo/Redo پشتیبانی می کنند. مثلا به کمک خاصیت Undo یک عنصر حذف شده از Jtable را می توان باز گرداند و یا یک متن تغییر یافته را در JtextField به حالت قبل بازگرداند.
6- Swing شامل کامپوننت های جدید و مفیدی مانند Jtree , JprogressBar , Jtable , JInternalFrameو ... می باشد.
7- پشتیبانی از خاصیت Look and Feel یا به اختصار L&F یا LnF توسط Swing که یکی از ویژگی های بسیار مهم در طراحی واسط ه توسط Swing می باشد. توسط این قابلیت، برنامه ها در یک محیط جدید (سیستم عامل دیگر ) بدون نیاز به کامپایل مجدد (Run-time ) کامپوننت های خود را تنظیم می کنند.

این تنظیمات میتواند به یکی از دو فرم زیر باشد:
• به گونه ای عمل کنیم تا واسط طراحی شده در تمامی سیستم عامل ها به یک صورت نمایش داده شوند.(بدون تغییر در ظاهر اجزا)
• به گونه ای عمل کنیم تا کامپوننت های واسط طراحی شده در هر سیستم عامل مشابه کامپوننت های سیستم عامل مورد نظر تغییر شکل دهند.
اگر شما یک اپلیکیشن ویندوز مایکروسافت را با VB یا C# بخواهید بنویسید، شما باید نحوه استفاده ابزار رسم گرافیکی را بدانید. این ابزار به شما کمک می کند تا ظاهر اپلیکیشن خود را طراحی کنید. اینها کد های GUI زیادی را برای شما ایجاد می کنند. ادامه ی این بخش اصول نمایش پنجره ها و رسم محتویات آن را نشان می دهد.

ایجاد یک Frame

یک پنجره ی سطح بالا (یک پنجره که درون آن شامل پنجره ی دیگری نیست) در جاوا یک frame نامیده می شود. کتابخانه AWT دارای کلاسی به نام Frame برای این سطح بالا می باشد. ورژن swing برای این کلاس ، JFrame نامیده می شود و گسترش یافته ی کلاس Frame است. JFrame یکی از معدود اجزای Swing است که بر روی یک بوم نقاشی نیست ، بنابراین دکوراسیون (دکمه ها، نوار عنوان، آیکون ها، و غیره) بر اساس سیستم ایجاد پنجره ی کاربرکشیده شده است، نه با Swing.
اکثر کلاسهای کامپوننت Swing با " J" شروع می شود مانند: JButton,JFrame و غیره. کلاسهای Button و Frame هم وجود دارد که اینها کامپوننت های AWT می باشند. اگر شما "J" را ازقلم بیاندازید، برنامه ی شما کامپایل و اجرا خواهد شد. اما ترکیبی از Swing و کامپوننت های AWT می تواند منجر به ناسازگاری و تناقض بصری و رفتاری شود.
کلاس های swing در بسته javax.swing قرار می گیرد.
نام پکیج Javax (java extended) نشان می دهد که یک بسته فرمت جاوا است. به دلایل گذشته Swing یک گسترش در نظر گرفته شده است. با این حال، در هر پیاده سازی جاوا SE پس از نسخه ی 1.2 ارائه شده است.
Swing شامل 18 بسته (Package‌) اصلی به شرح زیر می باشد:

1- javax.swing
2- javax.swing.event
3- javax.swing.text
4- javax.swing.text.html
5- javax.swing.text.html.parser
6- javax.swing.text.rtf
7- javax.swing.tree
8- javax.swing.undo
9- javax.swing.plaf
10- javax.swing.plaf.basic
11- javax.swing.plaf.metal
12- javax.swing.plaf.multi
13- javax.swing.plaf.synth
14- javax.swing.table
15- javax.accessibility
16- javax.swing.border
17- javax.swing.colorchooser
18- javax.swing.filechooser

در بین بسته های فوق دو بسته ی اول بیشترین کاربرد را دارا می باشند.
برنامه نویسان می توانند از سازنده ی GUI برای جاوا استفاده کنند. اما ما احساس می کنیم که برای اینکه به طور موثر از این ابزار استفاده کنید ، باید بدانید که یک واسط گرافیکی کاربر چگونه به صورت دستی ساخته می شود.
ما در اینجا هر دو شیوه را ارائه می کنیم

روش اول:

در Netbeans ابتدا پروژه ای بنام SampleFrame (تیک تابع Main را بر می داریم) و در آن پکیج sample ایجاد می کنیم و از مسیر زیر JFrame را ایجاد می کنیم: (وقتی یک بار Jframe را از این مسیر وارد کنیم بعد از این Jframe در لیست New می آید)
New > Other< راست کلیک روی پروژه
در پنجره ی باز شده در ستون Categories شاخه ی Swing GUI Forms را انتخاب کرده و از ستون باز شده ی File Type مقابل Jframe Form را انتخاب می کنیم. مانند شکل زیر:
و Next می کنیم. در پنجره ی باز شده ی بعدی یک نام به آن می دهیم (MyFrame):
(زمانی که طی می شود تا این عمل را نشان دهد، به سر عت سیستم تان بستگی دارد.)
دو محیط داریم : محیط Visual Editor و محیط کد.
تب Design بخش طراحی را نشان می دهد. در سمت راست، پنجره ی Palette را داریم که با درگ و دراپ، عناصر را از آنجا انتخاب می کنیم. این عناصر در دسته های مختلفی قرار گرفته اند که بعدا معرفی می کنیم.
اگر پنجره ی Palette را بستیم از منوی Window می توانیم آن را فعال کنیم:
آیکن های زیر برای Align (راست به چپ و چپ به راست وعمودی و افقی و...) بکار می رود.
تب Source قسمت کد است. همانطور که در شکل زیر می بینید Paltte برای آن فعال نیست وبرای design فعال است.
در زیر کد آن را مشاهده می کنید . می بینید کلاس MyFrame که ایجاد کردیم از Javax.swing.Jframe ارث بری می کند ( برای اینکه واضح تر ببینید توصیحات( comment ها) را پاک کردیم)
وقتی پروژه را اجرا می کنیم یک پنجره خالی در گوشه ی سمت چپ بالا ایجاد می شود که ما می توانیم موقعیت نمایش آن را تغییر دهیم:
در تب Design ما می توانیم سایز آن را به صورت دستی تغییر دهیم.

روش دوم:

پروژه ای به نام SampleFramecode به همراه متد Main ایجاد می کنیم. کد نویسی را در متد Main شروع می کنیم:
همیشه برای اینکه از کلاس استفاده کنیم ازروی آن نمونه می سازیم. به همین خاطر از کلاس Jframe با استفاده از دستور New نمونه می سازیم.
Jframe frame1=new Jframe();
به محض استفاده از کلاس Jframe به طور خود کار پکیج مربوط به آن را import می کند(در کادر قرمز شکل زیر)

متد setVisible()

اکنون ما فقط از روی کلاس Frame نمونه ساختیم اما آنرا در اجرا نمی بینیم. برای مشاهده ی آن باید از متد setVisible() استفاده کنیم.
Frame1.setVisible(true);
با اجرای پروژه یک پنجره ی کوچک به شکل زیر(درکادر قرمز) ایجاد می شود که سایز آن را می توان به صورت دستی تغییر دهیم:
متد setSize()
برای تغییر سایز آن از متد setSize() استفاده می کنیم.
Dimension به آن بعد می دهد. ما دومی را انتخاب می کنیم و به عرض و ارتفاع آن مقدار 200 و 300 می دهیم:
کدهای بالا را وارد کنید و اجرای آن را ببینید.
متد setLocation()
برای اینکه Frame در یک موقعیت خاص قرار گیرد از متد setLocation() استفاده می کنیم:
می توانیم یا نقطه یا مختصات بدهیم. ما مختصات 10 و 30 را می دهیم:
کدهای بالا را وارد کنید و اجرای آن را ببینید.
متدsetBuond()
با استفاده از متدsetBuond() همزمان کار دو تابع بالا ( setLocation() و setSize() ) را می توانیم انجام دهیم:
مقادیر دلخواه به آن بدهید و امتحان کنید.
بعنوان تمرین می توانیدFrame1.set را بنویسید و CTRL+Space را بزنید و متدهای ارائه شده را امتحان کنید:

SetAlwaysonTop : همیشه بالا قرار گیرد.
SetBackground : رنگ پس زمینه را تغییر می دهیم.
SetComponentOrientation : برای راست به چپ کردن یا چپ به راست کردن استفاده می شود.
SetComponentZorder : ترتیب اجرای برنامه ها روی همدیگرچگونه باشد.
setCursor(cursor type) : علامت موس روی فرم را تغییر می دهد. مانندزیر استفاده می شود:
); frame1.setCursor(Cursor.MOVE_CURSOR
setResizeable() : اگر False باشد، در زمان اجرا اجازه نمی دهد که اندازه فرم را تغییر دهیم.
SetTitle() : عنوان فرم را تعیین می کند.
setIconImage() : آیکن فرم را در نوار عنوان تغییر می دهد

اگر چندین بار پروژه مان را اجرا کنیم، به همان تعداد دفعه در حافظه Load می شود و هیچ وقت بسته نمی شود. برای مشاهده ی این مطلب در Task Manager به تب Processes نگاه کنید می بینید Java.exe به همان تعداد در حال اجرا است وقتی form ها را می بندیم، درProcesses هنوز Java.exe در حال اجرا است.
علت آن این است که متد Main هنوز درحال اجرا است و ما از لحاظ گرافیکی فرم را بستیم. برای رفع این مشکل فعلا به صورت دستی Java.exe را درTask manager می بندیم.
برای اینکه از این به بعد این مشکل پیش نیاید از متد ()setDefaultCloseOperation استفاده می کنیم.
این متد در اصل یک عدد( مثل 1 یا 2 و...) را به عنوان ورودی می خواهد. اما حفظ کردن این اعداد مشکل است و ما از تعدادی const که خود شرکت Sun ارائه کرده کمک می گیریم که بهتر است. برای استفاده از آنها ابتدا JFrame. را تایپ می کنیم و سپس CTRL + Space را می زنیم تا تمام آنها را نشان دهد.(مانند شکل زیر) و از لیست متدهای ارائه شده، متد EXIT_ON_CLOSE را انتخاب می کنیم(کادر قرمز).
با این کارزمانیکه فرم را می بندیم، کلا ازاجرای آن پروژه خارج می شود.
اگر ازطریق Design frame را ایجاد کرده باشیم، این کاررا از طریق پنجره Properties انجام می دهیم. مانند آنچه که در شکل زیر می بینید، قسمت defaultclose آن را EXIT_ON_CLOSE قرار می دهیم.(البته این حالت پیشفرض خودش است)
اگر پنجره ی Properties فعال نبود، از منوی Window آنرا می آوریم.
در این پنجره می توان خصوصیات هر چیزی را تعیین کرد، که در آینده به تدریج از آنها استفاده می کنیم.
در پایان این بخش یک سری اطلاعات اضافی که لازم است بدانید را به عنوان ضمیمه ارائه می کنیم:

سلسله مراتب وراثت کلاس JFrame :


JApplet : اجرای برنامه با مرورگر وب جاوا ویا اپلت های دیگر فعال شده.
JDialog : پنجره برای جمع آوری ورودی کاربر است.
JFrame: پنجره سطح بالا اپلیکیشن.
JInternalFrame : Frame داخلی است که برای ایجاد یک برنامه MDI می تواند در یک جزء JDesktopPane قرار داده شود.
JPanel: محتوایی سبک برای نگهداری بخش هایی از رابط. محتوا را می توان در هر محتوا دیگر استفاده کرد. مانند JFrame، JPanel، JApplet، یا کامپوننت JDialog.
Bean Form: تمپلیت مورد استفاده برای ایجاد یک فرم جدید مبتنی بر هر یک از کامپوننت های JavaBeans. فرم جدید می تواند بصری یا غیر بصری باشد. یک Beans هرکلاسی که با معماری کامپوننت Javabeans کامپایل می شود. Beans باید یک سازنده های عمومی public) ) بدون پارامتر داشته باشد. استفاده از کامپوننت Swing مثالی از Javabeans است.
AWT Forms: فرم های ویژوال براساس AWT . فرم های AWT شامل Applet, Dialog, Frame, و Panelمی باشد
Sample Forms: فرم های نمونه سفارشی که شامل یک برنامه مبتنی بر JFrame با سه منو. یک برنامه JFrame که می تواند به عنوان پنجره اصلی برای برنامه MID و Dialog box با دکمه ی OK و Cancel استفاده می شود.

آیکن های بخش Swing
1- فرم Jpanle
2- فرم Bean
آبجکت فرم JInternational Frame
آبجکت فرم Swing و AWT
آبجکت فرم دیالوگ(Dialog)swing وAWT
آبجکت فرم اپلت swing وAWT که شامل:
1- Applet Forme
2- JApplet Forms
آبجکت فرم پنل AWT

کلاس معرف / نام کامپوننت
Panel / javax.swing.JPanel
Tabbed Pane / javax.swing.JTabbedPane
Split Pane / javax.swing.JSplitPane
Scroll Pane / javax.swing.JScrollPane
Tool Bar / javax.swing.JToolBar
Desktop Pane / javax.swing.JDesktopPane
Internal Frame / javax.swing.JInternalFrame
Layered Pane / javax.swing.JLayeredPane
Label / javax.swing.JLabel
Butto / javax.swing.JButton
Toggled Butto / javax.swing.JToggleButton
Check Box / javax.swing.JCheckBox
Radio Button / javax.swing.JRadioButton
Button Group / javax.swing.ButtonGroup
Combo Box / javax.swing.JComboBox
List / javax.swing.JList
Text Field / javax.swing.JTextField
Text / javax.swing.JTextArea
Scroll Bar / javax.swing.JScrollBar
Slider / javax.swing.JSlider
Progress Bar / javax.swing.JProgressBar
Formatted Field / javax.swing.JFormattedTextField
Password Field / javax.swing.JPasswordField
Spinner / javax.swing.JSpinner
Separator / javax.swing.JSeparator
Text Pane / javax.swing.JTextPane
Editor Pane / javax.swing.JEditorPane
Tree / javax.swing.JTree
Table / javax.swing.JTable
Menu Bar / javax.swing.JMenuBar
Men / javax.swing.JMenu
Menu Item / javax.swing.JMenuItem
Menu Item/CheckBox / javax.swing.JCheckBoxMenuItem
Menu Item/RadioButton / javax.swing.JRadioButtonMenuItem
Popup Menu / javax.swing.JPopupMenu
Separator / javax.swing.JSeparator
Dialog / javax.swing.JDialog
Frame / javax.swing.JFrame
Color Chooser / javax.swing.JColorChooser
File Chooser / javax.swing.JFileChooser
Option Pane / javax.swing.JoptionPane

تعریف چند اصطلاح:

در اینجا به معرفی چند اصطلاح که زیاد به آنها برخورد می کنید که قبلا باید گفته می شد ، می پردازیم.
IDE : (Integrad Development Environment) محیط توسعه مجتمع: محیطی شامل ویرایشگر به اضافه دیباگر و سایر ابزار مورد نیاز برای توسعه نرم افزار (برنامه نویسی). مانند netbeans، eclipse ، و ویژوال استودیو و....
JRE: (Java Runtime Environment) محیط اجرایی جاوا: برای اجرا نیاز است . شامل JVM و یه سری برنامه های دیگر است.
JDK : (java Developer Kit) کیت توسعه ی جاوا: برای برنامه نویسان نیاز است.
Jvm : (Java virtual machin) ماشین مجازی جاوا.
وقتی یک برنامه را نوشتیم و شروع به اجرا و کامپایل می کنیم :
ابتدا JDK آن را به بایت کد تبدیل می کند
سپس JRE فایل های مورد نیاز (کتابخانه های جاوا) را فراهم می کند (برای جاوا)
در آخر JVM به وسیله مفسرش برنامه را اجرا می کند. اصولا ما با JVM کاری نداریم.